package com.kexio.security.service;

import java.util.List;

import com.kexio.common.dto.PageRequest;
import com.kexio.common.dto.PageResponse;
import com.kexio.security.domain.Role;

/**
 * 角色业务服务接口
 * 
 * @author kexio
 */
public interface RoleService {

    /**
     * 创建角色
     * @param role 角色实体
     * @return 角色实体
     */
    Role createRole(Role role);

    /**
     * 更新角色
     * @param role 角色实体
     * @return 角色实体
     */
    Role updateRole(Role role);

    /**
     * 根据ID获取角色
     * @param id 角色ID
     * @return 角色实体
     */
    Role getRoleById(Long id);

    /**
     * 根据角色编码获取角色
     * @param roleCode 角色编码
     * @return 角色实体
     */
    Role getRoleByCode(String roleCode);

    /**
     * 分页查询角色
     * @param roleName 角色名称
     * @param status 状态
     * @param pageRequest 分页参数
     * @return 分页结果
     */
    PageResponse<Role> queryRoles(String roleName, Integer status, PageRequest pageRequest);

    /**
     * 获取所有角色
     * @return 角色列表
     */
    List<Role> getAllRoles();

    /**
     * 根据状态获取角色
     * @param status 状态
     * @return 角色列表
     */
    List<Role> getRolesByStatus(Integer status);

    /**
     * 根据用户ID获取角色
     * @param userId 用户ID
     * @return 角色列表
     */
    List<Role> getRolesByUserId(Long userId);

    /**
     * 启用角色
     * @param id 角色ID
     * @return 是否成功
     */
    boolean enableRole(Long id);

    /**
     * 禁用角色
     * @param id 角色ID
     * @return 是否成功
     */
    boolean disableRole(Long id);

    /**
     * 删除角色
     * @param id 角色ID
     * @return 是否成功
     */
    boolean deleteRole(Long id);

    /**
     * 批量删除角色
     * @param ids 角色ID列表
     * @return 删除数量
     */
    int deleteRoles(List<Long> ids);

    /**
     * 分配权限
     * @param roleId 角色ID
     * @param permissionIds 权限ID列表
     * @return 是否成功
     */
    boolean assignPermissions(Long roleId, List<Long> permissionIds);

    /**
     * 移除权限
     * @param roleId 角色ID
     * @param permissionIds 权限ID列表
     * @return 是否成功
     */
    boolean removePermissions(Long roleId, List<Long> permissionIds);

    /**
     * 获取角色权限
     * @param roleId 角色ID
     * @return 权限ID列表
     */
    List<Long> getRolePermissions(Long roleId);

    /**
     * 检查角色编码是否存在
     * @param roleCode 角色编码
     * @param excludeId 排除的角色ID
     * @return 是否存在
     */
    boolean existsByRoleCode(String roleCode, Long excludeId);

    /**
     * 检查角色名称是否存在
     * @param roleName 角色名称
     * @param excludeId 排除的角色ID
     * @return 是否存在
     */
    boolean existsByRoleName(String roleName, Long excludeId);
}
